//ESTE SERIA REALIZA MODELO (ACOMODAR)


package educar.models;


import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

import educar.db.DbConnection;
import educar.db.JPA;

/**
 * 
 * @author Baldani-Ocejo-Padula
 * 
 * Clase que modela una realizacion de una actividad por parte de un alumno o alumnos.
 * Incluye tambien informacion sobre la resolucion correspondiente a la actividad
 *
 */
public class Realizacion
{

    private static JPA jpa = new JPA();
    private String fechaYhora;
    private Alumno alumno;
    private Actividad actividad;
    private Resolucion resolucion;

    /**
     * @return una resprentacion en cadena de texto del objeto.
     */
    public String toString()
    {
    	return alumno.getApellido() + ", " + alumno.getDni()  + " - " + resolucion.getCodigo();
    }
    
    /**
     * Constructor de la clase
     * 
     * @param dniAlumno dni del alumno que realiza esta resolucion de actividad
     * @param codActividad codigo de la actividad a resolver
     * @param codResolucion codigo de la resolucion que envia el alumno
     * @throws resolucionNotFound si la resolucion para la cual se crea la realizacion no existe
     */
    public Realizacion(String dniAlumno, String codActividad, String codResolucion) throws resolucionNotFound
    {
        try
        {
            resolucion = Resolucion.getResolucionByCodigo(codResolucion);
            alumno = Alumno.getAlumnoByDni(dniAlumno);
        }
        catch (Exception a)
        {
            throw new resolucionNotFound();
        }
        try
        {
            actividad = Actividad.getbyCodigo(codActividad);
        }
        catch (actividadNotFound e)
        {
            throw new resolucionNotFound();
        }
        Date dt = new Date();
        DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        fechaYhora = f.format(dt);
    }

    /**
     * 
     * @param a alumno que resuelve la actividad
     * @param ac actividad que resuelve el alumno
     * @param r resolucion que envia el alumno para la actividad
     */
    public Realizacion(Alumno a, Actividad ac, Resolucion r)
    {
        alumno = a;
        actividad = ac;
        resolucion = r;
        Date dt = new Date();
        DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        fechaYhora = f.format(dt);
    }

    /**
     * 
     * @param dniAlumno dni del alumno que realiza la actividad
     * @param codActividad codigo de la actividad que el alumno realiza
     * @param fh fecha y hora de la realizacion
     * @param codRes codigo de la resolucion que el alumno realiza para la actividad
     * @throws resolucionNotFound si la resolucion no existe
     */
    public Realizacion(String dniAlumno, String codActividad, String fh, String codRes) throws resolucionNotFound
    {
        try
        {
            alumno = Alumno.getAlumnoByDni(dniAlumno);
        }
        catch (alumnoNotFound a)
        {
            throw new resolucionNotFound();
        }
        try
        {
            actividad = Actividad.getbyCodigo(codActividad);
        }
        catch (actividadNotFound a)
        {
            throw new resolucionNotFound();
        }
        resolucion = Resolucion.getResolucionByCodigo(codRes);
        fechaYhora = fh;
    }

    /**
     * 
     * @param al alumno que realiza la actividad
     * @param act actividad para la cual el alumno envia la resolucion
     */
    public Realizacion(Alumno al, Actividad act)
    {
        alumno = al;
        actividad = act;
        Date dt = new Date();
        DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        fechaYhora = f.format(dt);

    }

    /**
     * metodo que guarda en la base de datos la informacion de este objeto
     * 
     * @return verdadero si se pudo guardar en la base de datos, falso en caso contrario
     */
    public boolean save()
    {
        String[] columns = { "dniAlu", "codigoAct", "fecha", "codigoRes" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd+".realiza", columns);
        try
        {
            stm.setString(1, alumno.getDni());
            stm.setString(2, actividad.getCodigoActividad());
            stm.setString(3, fechaYhora);// fecha
            stm.setString(4, resolucion.getCodigo());

        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);


        return true;
    }
    
    /**
     * 
     * @return la actividad que se lleva acabo en esta realizacion
     */
    public Actividad getActividad()
    {
        return actividad;
    }
    /**
     * 
     * @return la resolucion correspondiente a esta realizacion
     */
    public Resolucion getResolucion()
    {
        return resolucion;
    }
    /**
     * 
     * @return fecha y hora de la realizacion
     */
    public String getFechaYHora()
    {
        return fechaYhora;
    }
    /**
     * 
     * @return el alumno que esta involucrado en esta realizacion (actividad individual)
     */
    public Alumno getAlumno()
    {
        return alumno;
    }

    /**
     * 
     * @param actividad actividad que se quiere agregar a esta realizacion
     */
    public void setActividad(Actividad actividad)
    {
        this.actividad = actividad;
    }
    /**
     * 
     * @param alumno alumno que se quiere agregar a esta realizacion
     */
    public void setAlumno(Alumno alumno)
    {
        this.alumno = alumno;
    }
    /**
     * 
     * @param r resolucion para la cual se quiere obtener la realizacion
     * @return un objeto de tipo realizacion correspondiente a la resolucion pasada por parametro
     */
    public static Realizacion getRealizacionByResolucion(Resolucion r)
    {
        return getRealizacionByCodigo(r.getCodigo());
    }

    /**
     * 
     * @param codigoRes codigo de la resolucion para la cual se quiere obtener la realizacion de la base de datos
     * @return un objeto de tipo realizacion correspondiente a la resolucion pasada por parametro
     */
    public static Realizacion getRealizacionByCodigo(String codigoRes)
    {
        ResultSet rs = null;
        Realizacion r = null;

        rs = jpa.getByField("realiza", "codigoRes", codigoRes);


        try
        {
            if (rs.next())
            {
                r = new Realizacion(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
            }
            else
            {
                throw new resolucionNotFound();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return r;
    }

    /**
     * 
     * @param r resolucion que se quiere adjuntar a esta Realizacion
     */
    public void setResolucion(Resolucion r)
    {
        resolucion = r;
    }

    public static Realizacion getRealizacionByActividadAlumno(Actividad actividad, Alumno alumno) throws resolucionNotFound
    {
        ResultSet rs = null;

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("codigoAct", actividad.getCodigoActividad());
        map.put("dniAlu", alumno.getDni());
        rs = jpa.genericSelect("realiza", map);
        Realizacion r = null;
        try
        {
            if (rs.next())
            {
                r = new Realizacion(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
            }
            else
            {
                throw new resolucionNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return r;

    }

}
